import Interface.Fu;
import Interface.Zi;

/**
    java语言继承是单继承的,一个类只有一个父类,可以多级继承(父类>爷类>超爷类),父类可以有多个子类;
    定义父类的格式：（一个普通的类定义）
    public class 父类名称 {...}

    定义子类的格式：
    public class 子类名称 extends 父类名称 {...}
    ------------------------------------------------------
    在父子类的继承关系当中，创建子类对象，访问成员变量及成员方法的规则：
    创建的对象是谁，就优先用谁，如果没有则向上找。
    注意事项：
        无论是成员方法还是成员变量，如果没有都是向上找父类，绝对不会向下找子类的。
    ------------------------------------------------------
    重写（Override）
    概念：在继承关系当中，方法的名称一样，参数列表也一样。

    重写（Override）：方法的名称一样，参数列表【也一样】。覆盖、覆写。
    重载（Overload）：方法的名称一样，参数列表【不一样】。
    注意事项:
        1.子类方法的返回值必须【小于等于】父类方法的返回值范围。
          小扩展提示：java.lang.Object类是所有类的公共最高父类（祖宗类），java.lang.String就是Object的子类。
        2.子类方法权限必须【大于等于】父类方法的权限修饰符。
         小扩展提示：public > protected > (default)留空 > private
    ------------------------------------------------------
    继承关系中，父子类构造方法的访问特点：
        1.子类构造默认隐含的“super()”调用,所以一定是先调用的父构造,后子构造。
        2.子类构造可以通过super关键字来调用父类重载构造。
        3.super的父类构造调用，必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。
    总结：
        子类必须调用父类构造方法，不写则赠送super()；写了则用写的指定的super调用，super只能有一个，还必须是第一个。


 */
public class Demo01Extends {

    public static void main(String[] args) {
        /*---继承用法--------------*/
        Fu fu = new Fu(); // 创建父类对象
        System.out.println(fu.numFu); // 只能使用父类的东西，没有任何子类内容
        System.out.println("---------------------");

        Zi zi = new Zi();  //创建子类
        System.out.println(zi.numFu); // 10  可以调用父的变量
        System.out.println(zi.numZi); // 20  //也可以调用自己的
        System.out.println("---------------------");


        /*---同名变量调用关系--------------*/
        // 等号左边是谁，就优先用谁
        System.out.println(zi.num); // 优先子类，200
        System.out.println("---------------------");

        // 这个方法是子类的，优先用子类的，没有再向上找
        zi.methodZi(); // 200
        // 这个方法是在父类当中定义的，
        zi.methodFu(); // 100
        System.out.println("---------------------");

        /*---super使用--------------*/
        zi.method();
    }
}
